Introduction

Atrocity Propaganda

“History stopped in 1936- after that, there was only propaganda” - George Orwell

“We are children no more”, 15-year-old ‘Nayirah’” tells the Congressional Caucus, blinking back tears, her voice cracking as she describes Iraqi soldiers storming the hospital where she volunteered, stealing incubators and throwing babies onto the floor to die.(guyjohn59 2010) It’s 1991, Vietnam’s legacy still looms large and the American public have no desire to be embroiled in yet another distant war, but Nayirah’s testimony sways them with the US invading Iraq 3-months later. Except it wasn’t true, any of it. Nayirah al-Sabah, the daughter of the Kuwaiti ambassador had never set foot in the hospital, instead she was coached to perfection for her Oscar winning performance by PR firm Hill and Knowlton who were directly employed by the Kuwaiti Government.(Abuhamad 1994) (“How False Testimony and a Massive U.S. Propaganda Machine Bolstered George H.W. Bushs War on Iraq,” n.d.)

Atrocity propaganda is nothing new, with lurid tales of fabricated massacres stretching back to the Crusades, but now storytelling is easier than ever before; all you need is a mobile and internet connection. There are now more hours of Syrian conflict footage online, than time elapsed since the war started.Almost five million people are currently trapped in Khartoum as Sudanese generals Abdel Fattah al-Burhan and Mohamed Hamdan Daglo vie for power and Twitter is awash with fake footage taken from conflicts in Yemen, Libya and even a computer game.(“Tanks And Twitter: Sudan Generals Multi-Pronged War,” n.d.) With most Twitter accounts geolocation data switched off, it’s game on for opportunists worldwide to create and share their own realities. Even with image metadata and reverse image search, it’s almost impossible to ascertain whether shared images are accurate, misrepresentative, staged or concocted by government backed bots. DALL.E2 will only make things worse, with the potential power to conjure up bespoke atrocities in every style from gritty World War II grayscale to heartrending full colour closeup at the click of a mouse.

Yet in a world where fiction seems higher definition than reality, satellite imagery could offer a glimmer of hope. In March 2022 Ukrainians reported the rape, murder and torture of hundreds of civilians in Bucha, with bodies strewn across the streets. Unsurprisingly, the Russian Defence Ministry immediately dismissed the allegations as, “another production of the Kyiv regime for the Western media”, blaming Ukrainian soldiers themselves for the killings. (Mirovalev, n.d.)However Maxar satellite data corroborated the Ukrainian narrative illustrating the bodies had been present long before Ukrainian forces entered the area.(“Bucha Killings: Satellite Image of Bodies Site Contradicts Russian Claims” 2022)

While high resolution Maxar data is only available commercially or for selected humanitarian disasters, medium resolution Sentinel-1 and Sentinel 2 satellite imagery is freely accessible online. Evidently it’s no magic bullet. evidence of newly dug mass graves or bombed buildings, proves only the incident is not a recycled copy-paste of a past atrocity and in isolation can rarely identify the true perpetrator, however it is already being used in conflict mapping. Depending on the location and nature of the violence, burning oil wells; abandoning agricultural land, (pictures here) construction of refugee camps and building damage have been used to identify and monitor armed conflict. Using methods to map meteor craters on the moon, a 2020 study used satellite imagery combined with machine learning to identify unexploded munitions from the Vietnam War embedded in overgrown bomb craters in rural Cambodia.(Lin et al. 2020) Detecting chemical and biological warfare with satellite imagery is less promising due to the low concentrations of the agents in the atmosphere, however vegetation changes could potentially be use as a proxy for contamination with radioactivity (Sutlieff, Berthoud, and Stinchcombe 2021) and journalists are already using satellite pictures to investigate North Korea’s chemical weapon capabilities.(“A Birds Eye View: Unearthing North Koreas Chemical Weapons,” n.d.)

Raqqa: The Perfect Perpetratorless Crime

Created in 2019, Amnesty International’s Strike Tracker used satellite imagery coupled with crowd sourced image labelling to create an accurate timeline for the 2017 US led Coalition bombing in the Syrian city of Raqqa. Attempting to destroy Islamic State’s “Caliphate”, Coalition forces fired over 30,000 missiles in a four-month bombardment, destroying 80% of the city and killing and injuring thousands of civilians. Pinning down responsibility was challenging as the Coalition accused ISIS, Russia blamed the US and the US denied all responsibility ruling less than one percent of civilian casualty reports “credible”.(April 25 2019 and P.m, n.d.)

Amnesty International enlisted thousands of digital activists to analyse a series of satellite photos of the same building to identify the exact date it was destroyed. After following a short interactive tutorial volunteers were presented with a new series of images to label. Combining the crowd sourced strike timeline with witness testimony and interviews, Amnesty forced the Coalition to admit responsibility for 159 civilian deaths.(“IS Conflict: Coalition Strikes on Raqqa ’Killed 1,600 Civilians’” 2019)

This project aims to collect the dataset necessary to replicate Amnesty’s Strike Tracker Project. However instead of using high resolution human labelled satellite images, medium resolution Sentinel-1 and Sentinel-2 images will be downloaded and in a future seminar paper (hopefully) used to investigate the efficacy of using machine learning methods to automatically detect building damage and to generate a destruction timeline using a simplified version of the methodology described in x. More specifically the project will:

  • Identify and download suitable satellite images from the SentinelHub API, an R wrapper will also be written to simplify this process

  • Collect and visualise data from UNOSAT illustrating the position of the coalition strikes (for the purposes of the future machine learning model this represents the ground truth)

  • Download series of news articles from Guardian/New York Times API illustrating who different media outlets hold responsible for the civilian deaths.

Medium Resolution Satellite Data (Sentinel-1 and Sentinel-2)

Overview

Launched by the European Space Agency in June 2015, primarily for agricultural monitoring and emergency management, Sentinel-2 collects land and ocean imagery to a maximum resolution of 10m every 5 days. (“Sentinel-2 - Missions - Sentinel Online,” n.d.)The imagery consists of 13 spectral bands ranging from visible (red, green, blue) to near infrared (NIR) and short wave infrared (SWIR), it also includes specific frequencies for identifying vegetation (bands 5-8a) and clouds (Band 10: Cirrus).(“Custom Scripts Tutorial,” n.d.)

Sentinel -1 was launched by the European Commission’s Copernicus Project a year earlier in April 2014, and collects Synthetic Aperture Radar (SAR) data every 10 days. (“Sentinel-1 - Missions - Sentinel Online,” n.d.)While Sentinel 2’s optical sensors allow it to capture imagery from reflected sunlight, Sentinel-1 produces its own electromagnetic beam (with 8 bands between 0.3GHz and 40GHz) and records its reflection. The longer wavelength radar frequencies not only pass straight through clouds so can be used in any weather, but penetrate soil and sand revealing hidden underground artefacts. Additionally, phase data can be extracted from the radar signal and used to calculate differences in surface topography with an accuracy of up to a few centimetres. (Earth Science Data Systems 2020) Combining these height difference calculations with machine learning techniques, one 2022 study identified buildings damaged by earthquakes.(Earth Science Data Systems 2020)

Real colour images can be constructed by superimposing red, green and blue bands but often it is more revealing to use false colour. The optimal frequency depends on the exact nature of the task. Infrared is generally preferable for forestry mapping as soil and vegetation are difficult to differentiate in true colour imagery (as their spectral reflectances are almost identical in the visible range), however there is a difference of almost 30% in the mid-infrared band. (“Custom Scripts Tutorial,” n.d.)

Frequencies can also be combined to accentuate features of interest, blending green (band 3), red (band 4) and infrared (band 8) creates a “false colour” image amplifying the infrared band. In 2020, Amnesty International used false colour imagery to identify vegetation burnt by gun propellant to pinpoint the firing position of Tigray strikes on Eritrea. (https://citizenevidence.org/author/wallace-fan 2023)Hundreds of standard combinations exist with the majority used to highlight vegetation, its water content and the chemical composition of the surrounding soil for use in crop monitoring.(include experimental imagery here from EO browser, Raqqa, destroyed buildings in blue+ resolution etc, talk about trade off with resolution, size of antenna, include formulae for some of the different combinations)

captioncaption

caption

To choose suitable bands for identifying building destruction, I followed a simplified version of the methodology described by Pfeiffle (2022) and Putri et al. (2022). (Sandhini Putri, Widyatmanti, and Umarhadi 2022) [Conflict identification] Pfeiffle used machine learning methods to automatically identify building damage from airstrikes in Iraq and Northern Syria, choosing all Sentinel-2 images with a 10m resolution (red, green, blue and NIR). Assuming the damage profile of bombed buildings would be similar to those damaged in earthquakes, I also downloaded Sentinel-1 GRD imagery as Putri et al. concluded a fusion of Sentinel-1 and Sentinel-2 data yielded the highest accuracy in their random forest model identifying building damage from the 2018 Lombok earthquake. It would also be interesting to explore the possibility of using phase or polarisation parameters in the Sentinel-1 data to pinpoint destruction.

Data Download Options

Sentinel Satellite data is available free online through the following portals:

The EO browser is an interface allowing registered users to easily select and download satellite imagery of regions of interest from an interactive map. Using simple drop down menus users can also select the relevant time range, level of maximum cloud coverage and type of image. Results are presented as a simple image list which not only offers the option of fusing single images into standard combinations including real colour, false colour and Normalised Difference Vegetation Index (NDVI), but also of creating custom combinations. Images can be saved, shared, pinned, downloaded and automatically woven into time lapse sequences.

Alternatively Sentinel-1, 2 and 3 imagery can be downloaded via the Copernicus Hub API. The R package sen2r has been written to simplify the process of accessing Sentinel-2 data, allowing users to access imahergy not only via the libraries custom functions but also through a Shiny backed GUI interface. The RESTful Sentinel Hub Process API provides full access to data from all Sentinel satellites including polarisation and phase information. Users are offered the ability to both select products and perform bespoke image processing using the platform’s Javascript based Evalscript. (Example of commented evalscript from code)

Although it’s possible to easily visualise, download and customise satellite imagery using EO Browser and sen2r, this project downloaded all imagery directly from the Sentinel Hub API. To use satellite data in a potential machine learning project I wanted to create an efficient data pipeline to collect and process large numbers of satellite photos without scrolling through multiple images manually via the browser. The sen2R package does offer this functionality but only for Sentinel-2 data, also it requires sci hub log-in which is only activated one week after registration (and would have made meeting this deadline impossible :))

Accessing the Sentinel Hub API

Configuring the OAUTH 2.0 authorisation in R was a challenging task, first it was necessary to register for a client ID and secret then create an oauth app to generate a token (which is valid for 1 hour) The Sentinal API requires a POST request specifying the endpoint and request body. The{r, eval=FALSE} add_headers argument must also be set, requiring: png images are returned {r, eval=FALSE} Accept;the body request will be sent in JSON {r, eval=FALSE} Content-Type and specifying the necessary authorisation parameters.

library(httr)
library(brio)# for loading text file with no extension
library(rio)
library(png)

### --- Oauth Authorisation to access API

# IDs and secrets
client_id <- readRDS("Secrets/oauth_client_id.rds")
client_secret <- readRDS("Secrets/oauth_secret.rds")

# Create the app
app <- oauth_app(appname = "SatelliteImageryAnalysis",
                 key = client_id,
                 secret = client_secret)

# Create the oauth endpoint
endpoint <- oauth_endpoint(
  request = NULL,
  authorize = NULL,
  access = "token",
  base_url = "https://services.sentinel-hub.com/oauth")

# Cache the token to prevent API being called multiple times (token lasts 1 hour)
options(httr_oauth_cache=T) # prevents pop-up asking to cache token
token <- oauth2.0_token(endpoint = endpoint,
                        app = app,
                        use_basic_auth = T,
                        client_credentials = T)

Using a combination of these parameters coupled with these examples it was possible to structure the following request in JSON format. The upper portion of the JSON specifies the date range, region of interest (bbox); acceptable level of cloud cover (maxCloudCoverage);type of satellite footage required (type), resolution (width, height) and coordinate system (crs) while the lower section consists of evalscript to process the imagery.

  request={
    "input": {
        "bounds": {
            "properties": {
                "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84"
            },
            "bbox": [
                13.822174072265625,
                45.85080395917834,
                14.55963134765625,
                46.29191774991382
            ]
        },
        "data": [
            {
                "type": "sentinel-2-l2a",
                "dataFilter": {
                    "timeRange": {
                        "from": "2018-10-01T00:00:00Z",
                        "to": "2018-12-31T00:00:00Z"
                    }
                }
            }
        ]
    },
    "output": {
        "width": 512,
        "height": 512
    }
}

Ideally the POST request should be sent as a multipart form, which would allow the evalscript to be written in ordinary JSON. HoweverI was unable to do this correctly, so as a workaround escaped the entire JSON Evalscript section (using this tool) and sent it as part of the same request. The image information was then extracted from the response object and the file saved as png.

### --- Build request

request <- read_file("R Scripts/POST body request") # loads request from JSON in text file
sentinel_endpoint <- "https://services.sentinel-hub.com/api/v1/process"

# Specify which formats are accepted in request(JSON) and response(png)
response <- httr::POST(sentinel_endpoint, 
                       body=request, 
                       add_headers(Accept = "image/png", 
                                   `Content-Type`="application/json", 
                                   Authorization = paste("Bearer", token$credentials[[1]], sep = " ")))

Function to automatically download Sentinel-2 Data

To simplify the download process I converted this code to a function to download the Sentinel-2 data automatically. The function handles the authentication process and accepts the following arguments:

download_satellite_data(start_date, period_length_days, number_periods, min_lat,max_lat,min_long,max_long,satellite_type,cloud_cover,pixels_dimensions_height)

# Minimum and maximum latitudes and longitudes specify region of interest
# period_length, start_date and number of periods can be combined to specify data collection period
# For example: download_satellite_data("2017-05-01", 7, 32)
# Would return the best cloud free image taken every week from May 2017- September 2017 (32 in total)
# pixels_dimensions_height specifies the horizontal dimension of the output image in pixels

To make the file structure as clear as possible the JSON body of the request was stored in the separate text file (“POST body request.txt”) and imported to the R file containing the function (“Download Sentinel Satellite Data.R”. Str_replace() was used to replace the existing parameters with the user defined function arguments in the JSON code. str().

  request_with_start <- str_replace(request, "InsertStartDateHere", start_date_as_string)
  request_with_end <- str_replace(request_with_start, "InsertEndDateHere", end_date_as_string)
  
  ### Create satellite type parameter of request body----------
  request_with_satellite <- str_replace(request_with_end, "InsertSatelliteTypeHere", satellite_type)
  
  ### Create cloud cover parameter of request body----------
  request_with_cloudcover <- str_replace(request_with_satellite, "InsertCloudCoverHere", as.character(cloud_cover))

It is easiest to define the area of interest using the maximum and minimum longitudes and latitudes, however using the bbox argument in the JSON selected a much larger area than expected, so this function uses the type Polygon paramter instead. This argument takes a series of geo-coordinates and joins them up so the first and last coordinate must be the same to close the shape.

It was also necessary to specify the dimensions of the returned images as selecting width and height at random led to distorted, skewed pictures. Using the code below the size of region of interest in degrees was calculated then converted to kilometres using standard formulae. By calculating the ratio of the sides of the rectangle, the optimum height width ratio was calculated and combined with the users choice of pixels_dimensions_height to define the optimal image dimensions.

 ### Calculate optimum image size----
  # API demands user specifies the dimensions of the output image
  # To ensure it is not stretched, dimensions have been calculated based on user specifying desired number of pixels in horizontal direction
  
  # Calculate longitude and latitude differences from user input
  latitude_diff <- max_lat-min_lat
  longitude_diff <- max_long-min_long
  
  #Convert difference in latitude from degrees to km using standard conversion formula
  lat_metres <- abs(111.32*latitude_diff)
  long_metres <-  abs(longitude_diff*40075*cos(max_lat)/360)
  
  # Calculate ratio of height:length of the selected satellite image
  normalised_lat_km <- lat_metres/long_metres
  normalised_lat_km 
  
  # Calculate width of output image based on user defined pixel height
  pixels_dimensions_width= round(normalised_lat_km*pixels_dimensions_height)

Finally the date the image was taken was added to the image, this was simple as the date (current_date) was already saved in memory.

 ### Annotate png with Date---
  
#Extract date parameters to display
  year <- lubridate::year(current_date_start)
  month <- lubridate::month(current_date_start, label=TRUE)
  day <- lubridate::day(current_date_start)
  
  complete_date <- paste(day, month, year, sep=" ")
  
  processed_png <- image_read(data_filename)
  annotated_png <- image_annotate(processed_png, complete_date,location = "+10+450", size = 30, color = "white")

Data Visualisation: Coalition Airstrikes Against Raqqa: May-October 2017

Using this tutorial an animated GIF was created from the downloaded satellite imagery showing a stop animation of the 4-month bombardment of Raqqa.

library(dplyr)
library(purrr) 
library(magick) #For animation


raqqa_gif2 <- list.files(path = "../Sentinel 2A Imagery/", pattern = "*.png", full.names = T) %>% 
  map(image_read) %>% 
  image_join() %>% 
  image_annotate("Airstrikes on Raqqa, May 2017: November 2017", location = "+10+10", size = 20, color = "white")%>%
  image_animate(fps=1) %>% #controls speed of animation
  image_write("raqqa2.gif") 



summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00
“A Birds Eye View: Unearthing North Koreas Chemical Weapons.” n.d. https://www.unearthlabs.com/blogs/unearthing-north-koreas-chemical-weapons.
Abuhamad, Aziz. 1994. “The Kuwait Incubator Hoax.” Washington Post, February. https://www.washingtonpost.com/archive/opinions/1994/02/26/the-kuwaiti-incubator-hoax/35b1e882-f796-4acb-a106-9280a7dda521/.
April 25 2019, Alex Emmons, and 2:19 P.m. n.d. “Coalition Airstrikes in Raqqa Killed at Least 1,600 Civilians, More Than 10 Times U.S. Tally, Report Finds.” https://theintercept.com/2019/04/25/coalition-airstrikes-in-raqqa-killed-at-least-1600-civilians-more-than-10-times-u-s-tally-report-finds/.
“Bucha Killings: Satellite Image of Bodies Site Contradicts Russian Claims.” 2022. BBC News, April. https://www.bbc.com/news/60981238.
“Custom Scripts Tutorial.” n.d. https://www.sentinel-hub.com/explore/education/custom-scripts-tutorial/.
Earth Science Data Systems, NASA. 2020. “What Is Synthetic Aperture Radar?” https://www.earthdata.nasa.gov/learn/backgrounders/what-is-sar.
guyjohn59. 2010. “Nayirah Kuwaiti Girl Testimony,” June. https://www.youtube.com/watch?v=LmfVs3WaE9Y.
“How False Testimony and a Massive U.S. Propaganda Machine Bolstered George H.W. Bushs War on Iraq.” n.d. https://www.democracynow.org/2018/12/5/how_false_testimony_and_a_massive.
https://citizenevidence.org/author/wallace-fan. 2023. “Summit Series: A Beginners Guide to Sentinel Hub.” https://citizenevidence.org/2023/03/21/summit-series-a-beginners-guide-to-sentinel-hub/.
“IS Conflict: Coalition Strikes on Raqqa ’Killed 1,600 Civilians’.” 2019. BBC News, April. https://www.bbc.com/news/world-middle-east-48044115.
Lin, Erin, Rongjun Qin, Jared Edgerton, and Deren Kong. 2020. “Crater Detection from Commercial Satellite Imagery to Estimate Unexploded Ordnance in Cambodian Agricultural Land.” PLOS ONE 15 (3): e0229826. https://doi.org/10.1371/journal.pone.0229826.
Mirovalev, Mansur. n.d. “Bucha Killings: The World Cannot Be Tricked Anymore.” https://www.aljazeera.com/news/2022/4/4/will-the-bucha-massacre-wake-up-the-world.
Sandhini Putri, Ade Febri, Wirastuti Widyatmanti, and Deha Agus Umarhadi. 2022. “Sentinel-1 and Sentinel-2 Data Fusion to Distinguish Building Damage Level of the 2018 Lombok Earthquake.” Remote Sensing Applications: Society and Environment 26 (April): 100724. https://doi.org/10.1016/j.rsase.2022.100724.
“Sentinel-1 - Missions - Sentinel Online.” n.d. https://copernicus.eu/missions/sentinel-1.
“Sentinel-2 - Missions - Sentinel Online.” n.d. https://copernicus.eu/missions/sentinel-2.
Sutlieff, Gary, Lucy Berthoud, and Mark Stinchcombe. 2021. “Using Satellite Data for CBRN (Chemical, Biological, Radiological, and Nuclear) Threat Detection, Monitoring, and Modelling.” Surveys in Geophysics 42 (3): 727–55. https://doi.org/10.1007/s10712-021-09637-5.
“Tanks And Twitter: Sudan Generals Multi-Pronged War.” n.d. https://www.channelstv.com/2023/04/23/tanks-and-twitter-sudan-generals-multi-pronged-war/.